package com.cwt_taxi_xa.db.bll;

import android.content.Context;

import com.cwt_taxi_xa.MainApplication;
import com.cwt_taxi_xa.db.dal.LocalInfoDao;
import com.cwt_taxi_xa.model.LocalInfo;
import com.cwt_taxi_xa.protocol.DispatchCenterUsers;
import com.cwt_taxi_xa.protocol.Encoder;
import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.DateUtil;
import com.cwt_taxi_xa.util.StringUtil;
import com.cwt_taxi_xa.util.Tools;

import java.util.ArrayList;

/**
 * 交易数据 业务处理类
 * 签到、签退、运营数据本地保存
 * @author wlh
 */
public class LocalInfoBiz {

	private String TAG = "LocalInfoBiz";

	private LocalInfoDao dao;
	private static LocalInfoBiz instance;
	private static Context context = MainApplication.getInstance();

	private LocalInfoBiz(Context context){
		this.dao = new LocalInfoDao(context);
	}

	public static LocalInfoBiz getInstance(){
		if(instance == null){
			instance = new LocalInfoBiz(context);
		}
		return instance;
	}

	/**
	 * 添加一条交易数据
	 * @param info	交易数据
	 * @return
	 */
	public long addInfo(LocalInfo info){
		return dao.save(info);
	}

	/**
	 * 通过type查找数量
	 *
	 * 消息type
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public int getCount(int type){
		return dao.getCount(type);
	}

	/**
	 * 查找营运数据数量
	 */
	public int getBusinessCount(){
		return dao.getBusinessCount();
	}

	/**
	 * 通过type查找未上传数量
	 *
	 * 消息type
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public int getNoPostCount(int type){
		return dao.getNoPostCount(type);
	}

	/**
	 * 通过id更新为已上传状态
	 * @return int
	 */
	public int updateStatus(int id){
		return dao.updateStatus(id);
	}

	/**
	 * 通过id更新为已上传状态
	 * @return int
	 */
	public int updateStatus(String Data){
		return dao.updateStatus(Data);
	}

	/**
	 * 通过type查找全部信息
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public ArrayList<LocalInfo> getAllInfos(int type, int currentPage, int pageCount){
		return dao.findByType(type,currentPage,pageCount);
	}

	/**
	 * 通过type查找全部信息
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public ArrayList<LocalInfo> getAllInfos(int type){
		return dao.findByType(type);
	}

	/**
	 * 查找当天数据
	 */
	public ArrayList<LocalInfo> getTodayBusinessInfos(){
		return dao.getOneDayBusinessInfo2(DateUtil.getTodayDate(DateUtil.df9));
	}

	/**
	 * 查找当天数据
	 */
	public ArrayList<LocalInfo> getOneDayBusinessInfo(String date){
		return dao.getOneDayBusinessInfo2(date);
	}

	/**
	 * 查找7天数据
	 */
	public ArrayList<LocalInfo> get7daysBusinessInfo(){
		return dao.get7daysBusinessInfo();
	}

	/**
	 * 多条件查找全部信息
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public ArrayList<LocalInfo> getAllInfos(int type, int postStatus, String sTime, String eTime){
		return dao.findByType(type, postStatus, sTime, eTime);
	}

	/**
	 * 通过type查找未上传信息
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 */
	public ArrayList<LocalInfo> getNoPostInfos(int type){
		return dao.findNoPostByType(type);
	}

	/**
	 * 通过type查找最后一条未上传信息
	 *
	 * 0: 运营数据
	 * 1: 上班签到数据
	 * 2: 下班签退数据
	 * 3: GPS位置数据
	 * 4: 签到签退数据
	 */
	public LocalInfo getLastNoPostInfos(int type){
		return dao.findLastNoPostByType(type);
	}

	/**
	 * 查找最新的考勤信息
	 */
	public LocalInfo findLastCheckInfo(){
		return dao.findLastCheckInfo();
	}

	/**
	 * 查找最新的营运数据
	 */
	public LocalInfo findLastBusinessInfo(){
		return dao.findLastBusinessInfo();
	}

	/**
	 * 查找第一条营运数据
	 */
	public LocalInfo findFirstInfoByType(int type){
		return dao.findFirstInfoByType(type);
	}

	/**
	 * 通过计价器号和车次查找营运数据
	 */
	public LocalInfo findBusinessInfoByMeterAndCarTimes(String meterCode, int carTimes){
		return dao.findBusinessInfoByMeterAndCarTimes(meterCode, carTimes);
	}

	/**
	 * 删除通过计价器号和车次查找营运数据
	 */
	public void delBusinessInfoByMeterAndCarTimes(String meterCode, int carTimes){
		dao.delBusinessInfoByMeterAndCarTimes(meterCode, carTimes);
	}

	/**
	 * 查找未上传GPS数据，最大8条
	 *
	 */
	public ArrayList<LocalInfo> getNoPostGpsInfos(){
		return dao.getNoPostGpsInfos();
	}

	/**
	 * 清空表数据
	 * @return result != -1：成功
	 */
	public long clearInfos(){
		return dao.clearTable();
	}

	/*********************************GPS数据补传相关**********************************/

	private int gpsInfoIds[] = null;

	public int[] getGpsInfoIds() {
		return gpsInfoIds;
	}

	public void setGpsInfoIds(int[] gpsInfoIds) {
		this.gpsInfoIds = gpsInfoIds;
	}

	/**
	 * gps数据上传
	 */
	public void postGpsInfosBeforeClear(){
		if(gpsInfoIds != null && gpsInfoIds.length != 0){
			for(int i = 0;i<gpsInfoIds.length;i++){
				updateStatus(gpsInfoIds[i]);
			}
			setGpsInfoIds(null);
		}
		postGpsInfos();
	}

	/**
	 * gps数据上传
	 */
	public void postGpsInfos(){
		if(DispatchCenterUsers.isConnect()){
			ArrayList<LocalInfo> gpsInfos = getNoPostGpsInfos();
			if(gpsInfos != null && gpsInfos.size() != 0){
				if(gpsInfoIds == null){
					gpsInfoIds = new int[gpsInfos.size()];
				}
				for(int i = 0;i<gpsInfoIds.length;i++){
					gpsInfoIds[i] = gpsInfos.get(i).getMsgId();
				}
				DispatchCenterUsers.witeMsg(Encoder.getLocationInfoRepost(gpsInfos));
			}
		}
	}
	/*********************************位置信息上传相关**********************************/

	private String locationInfoData = "";

	private void setLocationInfoData(String locationInfoData) {
		this.locationInfoData = locationInfoData;
	}

	/**
	 * 位置信息上传
	 */
	public void clearLacationInfoData(){
		if(!StringUtil.isNull(locationInfoData)){
			updateStatus(locationInfoData);
			setLocationInfoData("");
		}
	}

	/**
	 * 位置信息上传
	 */
	public void postLocationInfo(byte[] heartBeatByte, String dbData){
		setLocationInfoData(dbData);
		AppLog.i(TAG,"【通讯平台】发送位置信息.......");
		DispatchCenterUsers.witeMsgConnected(heartBeatByte);
	}

	/*********************************营运数据上传相关**********************************/

	private int businessInfoId = -1;

	public int getBusinessInfoId() {
		return businessInfoId;
	}

	public void setBusinessInfoId(int businessInfoId) {
		this.businessInfoId = businessInfoId;
	}

	/**
	 * 营运数据上传
	 */
	public void postBusinessInfoBeforeClear(){
		if(businessInfoId != -1){
			updateStatus(businessInfoId);
			setBusinessInfoId(-1);
		}
		postBusinessInfo();
	}

	/**
	 * 营运数据上传
	 */
	public void postBusinessInfo(){
		if(businessInfoId != -1){
			return;
		}
		if(DispatchCenterUsers.isConnect()){
			LocalInfo lastBusinessInfo = getLastNoPostInfos(LocalInfo.TYPE_BUSINESS);
			if(lastBusinessInfo != null){
				setBusinessInfoId(lastBusinessInfo.getMsgId());
				//				DispatchCenterUsers.witeMsg(Tools.parseHexStr2Byte(lastBusinessInfo.getData()));
				DispatchCenterUsers.witeMsgConnected(Tools.parseHexStr2Byte(lastBusinessInfo.getData()));
				AppLog.e("运营数据不准测试---"+"本地数据上传(营运数据)；id:"+getBusinessInfoId()+
						"; "+lastBusinessInfo.getData());
				AppLog.e(TAG, "本地数据上传(营运数据)；id:"+getBusinessInfoId()+
						"; "+lastBusinessInfo.getData());
			}
		}
	}

	/*********************************考勤数据上传相关**********************************/

	private int checkInfoId = -1;

	public int getCheckInfoId() {
		return checkInfoId;
	}

	public void setCheckInfoId(int checkInfoId) {
		this.checkInfoId = checkInfoId;
	}

	/**
	 * 考勤数据上传
	 */
	public void postCheckInfoBeforeUpdate(int type, int result){
		if(checkInfoId != -1){
			updateStatus(checkInfoId);
			setCheckInfoId(-1);
		}
		postCheckInfo();
	}

	/**
	 * 考勤数据上传
	 */
	public void postCheckInfo(){
		if(DispatchCenterUsers.isConnect()){
			LocalInfo lastCheckInfo = getLastNoPostInfos(LocalInfo.TYPE_CHECK);
			if(lastCheckInfo != null){
				setCheckInfoId(lastCheckInfo.getMsgId());
				DispatchCenterUsers.witeMsg(Tools.parseHexStr2Byte(lastCheckInfo.getData()));
				AppLog.i(TAG, "本地数据上传（考勤数据）；id:"+getCheckInfoId()+"; "+lastCheckInfo.getData());
			}
		}
	}
}
